<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>

    // 递归(函数在执行过程中调用了自己)  

    // 特征: 先传递再回归

    // 注意:
    // 递归需要有跳出条件(临界值), 否则会形成死递归

   /*  var i = 10;
    var sum = 0;
    while(true){
        document.write(i +"<br>");
        sum += i;  // 10 9 8 7 6 5 4 3 2 1 
        if(i <= 1){
            break;  
        }
        i--;
    } */


    // debugger;
    // var i = 5;
    // var sum = 0;

    // function fn() {// 10
    //     console.log(i);
    //     sum += i;  // 10 9 8 7 6 5 4 3 2 1 

    //     if (i <= 1) {  // 满足特定条件之后停止递归
    //         return sum;
    //     } 
    //     i--;
    //     var res = fn();
    //     return res;
    // }
    // var result = fn(); // 1 
    // console.log(result);

    // fn(10) -> fn(9) -> fn(8) ... fn(3) => fn(2) => fn(1)
    //                                                 ||
    //   55 <=   55  <=   55    ...   55 <=   55  <=   55

    // 王者荣耀(6元)
    // 你   =>  同桌A  => 同桌B =>  同桌C  =>  同桌D
    //                                         ||
    //  6  <=     6  <=   6  <=     6  <=      6


    // 优化

    //    debugger;
    //     function fn(i,sum) {// 10  0, 9 10,
    //         console.log(i);
    //         sum += i;  // 10 9 8 7 6 5 4 3 2 1 

    //         if (i <= 1) {  // 满足特定条件之后停止递归
    //             return sum;
    //         } 
    //         i--;
    //         var res = fn(i,sum); // 9 10, 8 19
    //         return res;
    //     }
    //     var result = fn(10,0); // 1 
    //     console.log(result);


    // 递归(尾递归)
    function fn(i,sum) {// 10  0, 9 10,
        sum += i;  // 10 9 8 7 6 5 4 3 2 1 

        if (i <= 1) {  // 满足特定条件之后停止递归
            return sum;
        } 
        return fn(i-1,sum); // 9 10, 8 19
    }
    var result = fn(10,0); // 1 
    console.log(result);

    // fn(10) -> fn(9) -> fn(8) ... fn(3) => fn(2) => fn(1)
    //                                                 ||
    //   55 <=   55  <=   55    ...   55 <=   55  <=   55


</script>
</html>